package model

import (
	"fmt"
	"os"
	"path/filepath"

	"gitee.com/liumou_site/gf"
)

// CreateSymlink 函数用于创建指向指定源目录的软链接。
// 该函数首先检查 /etc/ssh 目录是否存在，如果存在则删除该目录，然后创建软链接。
// 返回值：
//   - error: 如果操作过程中发生错误，返回相应的错误信息；否则返回 nil。
func (i Info) CreateSymlink() error {
	if i.Debug {
		GetLanguageManager().Debug("创建软链接", "CreateSymlink")
	}
	// 检查 /etc/ssh 目录是否存在，如果存在则删除
	f := gf.NewFile("/etc/ssh")
	f.Exists()
	f.IsDir()
	if f.ExIst {
		GetLanguageManager().Info("/etc/ssh 目录已存在，正在删除: ", "The /etc/ssh directory already exists, delete it: ", f.FileName)
		i.Cmd.RunShell("rm", "-rf", "/etc/ssh")
		if i.Cmd.Err != nil {
			GetLanguageManager().Error("删除 /etc/ssh 目录失败: ", "Failed to delete /etc/ssh directory: ", i.Cmd.Err)
			return fmt.Errorf("failed to delete /etc/ssh directory: %s", i.Cmd.Err)
		}
	}
	// 创建指向源目录的软链接
	err := os.Symlink(filepath.Join(i.Source, "etc"), "/etc/ssh")
	if err != nil {
		GetLanguageManager().Error("创建软链接失败: ", "Failed to create soft link: ", err)
		return err
	}

	GetLanguageManager().Info("软链接创建成功", "Successfully created soft link")
	return nil
}

// IsSymlink 检查给定路径是否为一个符号链接。
//
// 参数:
//   - path: 要检查的文件或目录的路径。
//
// 返回值:
//   - bool: 如果路径是一个符号链接，则返回 true；否则返回 false。
//   - error: 如果检查过程中发生错误，则返回相应的错误信息；否则返回 nil。
func IsSymlink(path string) (bool, error) {
	// 使用 os.Lstat 获取文件信息，Lstat 不会跟随符号链接
	fileInfo, err := os.Lstat(path)
	if err != nil {
		return false, err
	}

	// 通过位运算检查文件模式中是否包含符号链接标志
	return fileInfo.Mode()&os.ModeSymlink != 0, nil
}
